package cl.sodexo.com.action;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import cl.sodexo.com.dto.Estado;
import cl.sodexo.com.dto.Requerimiento;
import cl.sodexo.com.dto.TipoRequerimiento;
import cl.sodexo.com.dto.Usuario;
import cl.sodexo.com.form.JefaturaRequerimientosForm;
import cl.sodexo.com.utils.Constantes;

/**
 * @author psep
 *
 */
public class JefaturaRequerimientosAction extends AbstractManagerDAO {
	
	private final static Logger logger	= Logger.getLogger(JefaturaRequerimientosAction.class);
	private final static String ACTION	= "action";
	private final static String	ACEPTAR	= "Aceptar";
	private final static String RECHAZAR= "Rechazar";
	private final static String ANALISIS= "analisis";
	private final static String NOESTADO= "6";
	private final static String REQ		= "1";
	
	public ActionForward execute(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpSession session	= request.getSession();
		Usuario user		= (Usuario) session.getAttribute(Constantes.USEROBJ); 
		
		if(!(Boolean) request.getSession().getAttribute(Constantes.SESSION)){
			return mapping.findForward(Constantes.ERROR); //TODO verificar página de dirección login
		}else if(!user.getPerfil().getIdPerfil().equals(Constantes.JEFE)
				&& !user.getPerfil().getIdPerfil().equals(Constantes.ADMIN)){
			return mapping.findForward(Constantes.ERROR); //TODO verificar página de dirección login
		}else{
			logger.info("session: " + user.getUsername());
			String action = request.getParameter(ACTION);
			String message= "";
			
			JefaturaRequerimientosForm jefeFrm	= (JefaturaRequerimientosForm) form;
			Requerimiento requerimiento			= new Requerimiento();
			Estado estado						= new Estado();
			TipoRequerimiento tipo				= new TipoRequerimiento();
			estado.setIdEstado(NOESTADO);
			tipo.setIdTipo(REQ);
			requerimiento.setEstado(estado);
			requerimiento.setTipoRequerimiento(tipo);
			
			jefeFrm.setRequerimientos(super.getRequerimientoDAO().getRequerimientosJefatura(requerimiento));
			
			logger.info("select: " + jefeFrm.getKey());
			
			if(action != null){
				if(jefeFrm.getKey().equals("")){
					message = "Debe seleccionar un requerimiento";
				}else{
					Requerimiento reqTO = this.getKeyRequerimiento(jefeFrm.getKey(), jefeFrm.getRequerimientos());
					
					if(reqTO == null){
						message = "El requerimiento es nulo";
					}else if(!this.action(reqTO.getIdRequerimiento(), action, user.getIdUsuario())){
						message = "Error al actualizar el requerimiento, intente más tarde";
					}else{
						if(action.equals(ACEPTAR)){
							super.beanRemote.finalizarProcesoActivo(reqTO.getKey(), ANALISIS);
							super.beanRemote.seteaVariablesTarea(reqTO.getKey(), ANALISIS, "tipo", reqTO.getTipoRequerimiento().getDescripcion());
							super.beanRemote.seteaVariablesTarea(reqTO.getKey(), ANALISIS, "idJefe", reqTO.getJefaturaGral().getIdUsuario());
							super.beanRemote.seteaVariablesTarea(reqTO.getKey(), ANALISIS, "nombre", reqTO.getJefaturaGral().getNombre());
							super.beanRemote.seteaVariablesTarea(reqTO.getKey(), ANALISIS, "estado", "Aceptado");
						}else{
							logger.info("Cierre de tarea");
//							long taskId = super.beanRemote.getTaskID(reqTO.getKey(), Constantes.PROCESS);
//							logger.info("taskID: " + taskId);
//							super.beanRemote.finalizarProcesoActivo(reqTO.getKey(), ANALISIS);
//							super.beanRemote.finalizarProcesoActivo(reqTO.getKey(), "calculo");
//							super.beanRemote.finalizarProcesoActivo(reqTO.getKey(), "validacion");
//							super.beanRemote.cierraTarea((int) taskId, "calculo");
						}
						
						message = "Requerimiento actualizado";
						jefeFrm.setRequerimientos(super.getRequerimientoDAO().getRequerimientosJefatura(requerimiento));
					}
				}
			}
			
			jefeFrm.setMessage(message);
			jefeFrm.setKey("");
    	    return mapping.findForward(Constantes.SUCCESS);
		}
	}
	
	/**
	 * @param key
	 * @param requerimientos
	 * @return
	 */
	private Requerimiento getKeyRequerimiento(String key, ArrayList<Requerimiento> requerimientos){
		Integer nKey = this.keyStrToInteger(key);
		
		if(nKey == null){
			return null;
		}else{
			return requerimientos.get(nKey);
		}
	}
	
	/**
	 * @param key
	 * @return
	 */
	private Integer keyStrToInteger(String key){
		Integer nKey = null;
		
		try{
			nKey = Integer.parseInt(key);
		}catch (Exception e) {
			logger.info("Key nula, excepción controlada");
		}
		
		return nKey;
	}
	
	/**
	 * @param key
	 * @param opcion
	 * @param idJefe
	 * @return
	 * @throws SQLException
	 */
	private Boolean action(String key, String opcion, String idJefe) throws SQLException{
		if(opcion == null){
			return false;
		}else if(opcion.equals(ACEPTAR) || opcion.equals(RECHAZAR)){
			Requerimiento requerimiento = new Requerimiento();// aceptado 2, 1 rechazado
			Estado estado				= new Estado();
			Usuario jefeGral			= new Usuario();
			requerimiento.setIdRequerimiento(key);
			jefeGral.setIdUsuario(idJefe);
			requerimiento.setJefaturaGral(jefeGral);
			
			if(opcion.equals(ACEPTAR)){
				estado.setIdEstado(Constantes.APROBADO);
			}else{
				estado.setIdEstado(Constantes.RECHAZADO);
			}
			
			requerimiento.setEstado(estado);
			
			return super.getRequerimientoDAO().updateJefeGral(requerimiento);
		}else{
			return false;
		}
	}

}
